package com.example.difffile.utils;

import com.github.difflib.text.DiffRow;
import com.github.difflib.text.DiffRowGenerator;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;

public class FileUtil {
    static String TARGETFILE;

    //拼接日期追加目录存放差异文件
    public static void create(String directory){
        File dir = new File(directory);
        //判断是否存在,不存在创建改目录
        if (!dir.exists()) {
            dir.mkdirs();
        }else {
            //存在就清空
            deleteDirectory(dir);
            dir.mkdirs();
        }

    }
    //删除目录下的所有数据
    public static void deleteDirectory(File file) {
        if (file.isDirectory()) {
            for (File subFile : file.listFiles()) {
                deleteDirectory(subFile);
            }
        }
        file.delete();
    }

    //获取不同的文件夹

    /**
     *
     * @param np 周五
     * @param op  SIT
     */
    public static void diffFile(String np, String op) {
        //以周五版本为基础生成的map
        Map<String, ArrayList<String>> filemap = FileUtil.getFileName(np);
        Set keySet = filemap.keySet();
        //遍历key
        keySet.forEach(dir -> {
            String opo = op + "\\" + dir + "\\";
            String npo = np + "\\" + dir + "\\";
            //获得路径下的全部文件名
            List<String> listFileName = getListFileName(opo);

            //获取周五版本下该文件夹下所有文件名
            for (String s : filemap.get(dir)) {
                int i=0;
                //判断该文件在Sit版本中存不存在
                if (FileUtil.ftFile(listFileName, s)) {
                    File file = new File(opo + s);
                    File file1 = new File(npo + s);
                    try {
                        //Sit文件
                        List<String> original = Files.readAllLines(file.toPath(), Charset.forName("GBK"));
                        //周五文件
                        List<String> revised = Files.readAllLines(file1.toPath(), Charset.forName("GBK"));

                        //生成差异文件
                        DiffRowGenerator generator = DiffRowGenerator.create()
                                .showInlineDiffs(false)
                                .mergeOriginalRevised(false)
                                .inlineDiffByWord(true)
                                .oldTag(f -> "~")
                                .newTag(f -> "**")
                                .build();

                        List<DiffRow> diffRows = generator.generateDiffRows(original, revised);
                        for (DiffRow row : diffRows) {
                            i++;
                            if (row.getTag() != DiffRow.Tag.EQUAL) {
                                String rour =i+"_"+ row.getTag() + "," + row.getNewLine() + "∰" + row.getOldLine();
                                FileUtil.writerFile(rour, (String) dir, s);
                            }
                        }
                    } catch (IOException e) {

                        e.printStackTrace();

                    }
                } else {
                    //该文件在Sit版本中不存在，判断是否为ADD形



                }

            }

        });
    }
    /**
     * 只需要获取周五版本的
     * 获得一级文件夹名和该文件夹下的所有文件名（包括后缀）
     *
     * @param route
     */
    public static Map<String, ArrayList<String>> getFileName(String route) {
        HashMap<String, ArrayList<String>> map = new HashMap<>();
        File folder = new File(route);
        File[] files = folder.listFiles();
        for (File file : files) {
            //判断是不是文件夹，若是文件夹再判断是否为空，空就跳过
            if (folder.isDirectory() && folder.list().length == 0){
                continue;
            }
            if (file.isDirectory()) {
                ArrayList<String> fileName = new ArrayList<>();
                map.put(file.getName(), fileName);
                File[] listFiles = file.listFiles();
                for (File listFile : listFiles) {
                    if (listFile.isFile()) {
                        fileName.add(listFile.getName());
                    }
                }
            }
        }

        return map;
    }
    //获得版本一级目录下的文件
    public static List<String> getListFileName(String rujin) {
        List<String> list = new ArrayList();
        File npathname = new File(rujin);
        File[] npath = npathname.listFiles();
        if (npath != null) {
            for (File np : npath) {
                //判断是否为文件
                if (np.isFile()) {
                    list.add(np.getName());
                }
            }
        }
        return list;
    }

    //判断该路径下文件是否存在
    public static boolean ftFile(List<String> list, String fileName) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).equals(fileName)) {
                return true;
            }
        }
        return false;
    }

    //写入文件
    public static void writerFile(String file, String dir, String fileName) throws IOException {
        String targetFile = TARGETFILE + "\\" + dir + "\\";
        File Dir = new File(targetFile);
        if (!Dir.exists()) {
            Path newFolder = Paths.get(String.valueOf(Dir));
            Files.createDirectories(newFolder);
        }
        String mulu = targetFile + fileName;
        try {
            File writerFile = new File(mulu);
            // 第二个参数表示追加内容到文件末尾，而不是覆盖文件内容
            FileWriter writer = new FileWriter(writerFile, true);
            // 换行符用于分隔多行内容
            writer.write(file + "\n");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
